package Fantasma;

import javax.swing.plaf.SliderUI;

import junit.framework.TestCase;
import Fantasma.Fantasma;

public class FantasmaTest extends TestCase {
	
	Fantasma miFantasma= new Fantasma();
	Posicion posAnterior;
	int agresividadAnterior;

	protected void setUp() throws Exception {
		super.setUp();
		posAnterior= miFantasma.getPosicion();
		agresividadAnterior = miFantasma.getAgresividad();
		
	
	}

	protected void tearDown() throws Exception {
		super.tearDown();
	}
	

	
	public void testMoverFantasmaMuerto() {
		miFantasma.convertirEnPresa();
		miFantasma.matar();
		try{
			miFantasma.mover();
			assertTrue(false);
		}
		catch (ExceptionFantasma e){
			assertTrue(true);
			assertTrue(miFantasma.getPosicion().comparateTo(posAnterior));
		}
		
	}
	
	
	public void testMoverFantasmaCazador() {
		miFantasma.mover();
		assertFalse(miFantasma.getPosicion().comparateTo(posAnterior));
		
		
	}
	
	
	public void testMoverFantasmaPresa() {
		miFantasma.convertirEnPresa();
		miFantasma.mover();
		assertFalse(miFantasma.getPosicion().comparateTo(posAnterior));
		
	}
	
	
	public void testMatarFantasmaCazador() {
		miFantasma.matar();
		assertEquals("Cazador", miFantasma.estadoString());
		
	}
	
	
	public void testMatarFantasmaPresa() {
		miFantasma.convertirEnPresa();
		miFantasma.matar();
		assertEquals("Muerto", miFantasma.estadoString());
		
	}
	
	
	public void testMatarFantasmaMuerto() {
		miFantasma.convertirEnPresa();
		miFantasma.matar();
		miFantasma.matar();
		assertEquals("Muerto", miFantasma.estadoString());
		//podria testearse que se lanze una excepcion pero esta comentadoel lanzamiento
		/*try{
			miFantasma.matar();
			assertTrue(false);
		}
		catch (ExceptionFantasma e){
			assertTrue(true);
		}*/		
		
	}
	
	
	public void testPasarAPresaFantasmaCazador() {
		miFantasma.convertirEnPresa();
		miFantasma.convertirEnPresa();
		assertEquals("Presa", miFantasma.estadoString());
	}
	
	
	public void testPasarAPresaFantasmaPresa() {
		miFantasma.convertirEnPresa();
		assertEquals("Presa", miFantasma.estadoString());
	}
	
	
	public void testPasarAPresaFantasmaMuerto() {
		miFantasma.convertirEnPresa();
		miFantasma.matar();
		miFantasma.convertirEnPresa();
		assertEquals("Muerto", miFantasma.estadoString());
		//podria testearse que se lanze una excepcion pero esta comentado el lanzamiento
		/*try{
			miFantasma.convertirEnPresa();
			miFantasma.matar();
			miFantasma.convertirEnPresa();
			assertTrue(false);
		}
		catch (ExceptionFantasma e){
			assertTrue(true);
		}*/		
		
	}
	
	
	public void testAumentaAgresividadFantasmaCazador() {
		miFantasma.molestar();
		assertTrue(miFantasma.getAgresividad() > agresividadAnterior);
		agresividadAnterior = miFantasma.getAgresividad();
		miFantasma.molestar();
		assertTrue(miFantasma.getAgresividad() > agresividadAnterior);
	}
	
	
	public void testNoAumentaAgresividadFantasmaPresa() {
		miFantasma.convertirEnPresa();
		miFantasma.molestar();
		assertEquals(miFantasma.getAgresividad() , agresividadAnterior);
		miFantasma.molestar();
		assertEquals(miFantasma.getAgresividad() , agresividadAnterior);
		
	}
	
	
	public void testNoAumentaAgresividadFantasmaMuerto() {
		miFantasma.convertirEnPresa();
		miFantasma.matar();
		miFantasma.molestar();
		assertEquals(miFantasma.getAgresividad() , agresividadAnterior);
		miFantasma.molestar();
		assertEquals(miFantasma.getAgresividad() , agresividadAnterior);
	}
	
	
	public void testTimeoutFantasmaMuerto() {
		miFantasma.convertirEnPresa();
		miFantasma.matar();
	     try {
	        Thread.currentThread();
			Thread.sleep(7000);
			assertEquals("Muerto",miFantasma.estadoString());
			Thread.sleep(2000);
			assertEquals("Cazador",miFantasma.estadoString());
			
	     }
	     catch (InterruptedException e) {
	         e.printStackTrace();
	     }
	}
	
	
	public void testTimeoutFantasmaPresa() {
		miFantasma.convertirEnPresa();
		try {
	        Thread.currentThread();
			Thread.sleep(4000);
			assertEquals("Presa",miFantasma.estadoString());
			Thread.sleep(2000);
			assertEquals("Cazador",miFantasma.estadoString());
			
	     }
	     catch (InterruptedException e) {
	         e.printStackTrace();
	     }
	}
	
	public void testTimeoutFantasmaMuertoEsRespetadoAntesDeTimeoutPresa(){
		miFantasma.convertirEnPresa();
		try {
	        Thread.currentThread();
			Thread.sleep(4000);
			assertEquals("Presa",miFantasma.estadoString());
			miFantasma.matar();
			assertEquals("Muerto",miFantasma.estadoString());
			Thread.sleep(6000);
			assertEquals("Muerto",miFantasma.estadoString());
			Thread.sleep(3000);
			assertEquals("Cazador",miFantasma.estadoString());
			
	     }
	     catch (InterruptedException e) {
	         e.printStackTrace();
	     }
	}
	
	public void testTimeoutFantasmaPresaSeReiniciaSiSeHacePresa2Veces(){
		miFantasma.convertirEnPresa();
		try {
	        Thread.currentThread();
	        assertEquals("Presa",miFantasma.estadoString());
			Thread.sleep(4000);
			assertEquals("Presa",miFantasma.estadoString());
			miFantasma.convertirEnPresa();
			Thread.sleep(4000);
			assertEquals("Presa",miFantasma.estadoString());
			Thread.sleep(2000);
			assertEquals("Cazador",miFantasma.estadoString());
			
	     }
	     catch (InterruptedException e) {
	         e.printStackTrace();
	     }
	}
	
	public void testPresaVuelveACazadorConMismaAgresividad(){
		miFantasma.molestar();
		miFantasma.molestar();
		agresividadAnterior = miFantasma.getAgresividad();				
		miFantasma.convertirEnPresa();
		
		try {
	        Thread.currentThread();
	    	Thread.sleep(6000);
			assertEquals(miFantasma.getAgresividad(),agresividadAnterior);
		 }
	     catch (InterruptedException e) {
	         e.printStackTrace();
	     }
	}
	
	public void testMuertoVuelveACazadorConAgresividadNula(){
		miFantasma.molestar();
		miFantasma.molestar();
		miFantasma.convertirEnPresa();
		miFantasma.matar();
				
		try {
	        Thread.currentThread();
	    	Thread.sleep(9000);
			assertEquals(miFantasma.getAgresividad() , 0);
		 }
	     catch (InterruptedException e) {
	         e.printStackTrace();
	     }
		
	}
	
	

	
}
